// 导入axios
import { h } from 'vue'
import { ElNotification } from 'element-plus'
import axios from 'axios'
import { useCounterStore } from "../pina/index";
import { removeToken, getToken } from '../utils/auth'
import { useRouter } from 'vue-router'
import JSONBIG from "json-bigint"

const router = useRouter();

axios.defaults.transformResponse = [
  function (data, headers) {
    // 获取 Content-Type
    const contentType = headers['content-type'];
    // 如果是 JSON 数据，使用 JSONBIG 解析
    // if (contentType && contentType.includes('application/json')) {
    //   // const json = JSONBIG({ storeAsString: true });
    //   return json.parse(data);
    // }
    // 对于其他类型的数据，直接返回
    return data;
  }
];

// 使用 axios 创建实例
const request = axios.create({
  // baseURL:'/api', //请求后端数据的基本地址，自定义
  timeout: 200000 // 请求超时设置，单位 ms
});

// 添加请求拦截器
request.interceptors.request.use(function (config) {
  // 机票
  if (config.url.includes('/api')) {
    config.baseURL = '/api';
    config.url = config.url.replace('/api', "");
  }

  // 是否需要设置 token
  // const isToken = (config.headers || {}).isToken === false;
  // if (getToken() && !isToken) {
  //   config.headers['Authorization'] = 'Bearer ' + getToken(); // 让每个请求携带自定义 token 请根据实际情况自行修改
  // }

  // 根据请求类型设置 Content-Type
  if (!config.headers['Content-Type']) {
    if (config.url.endsWith('.csv')) {
      config.headers['Content-Type'] = 'text/csv';
    } else if (config.url.includes('/upload') && config.data instanceof FormData) {
      config.headers['Content-Type'] = 'multipart/form-data';
    } else {
      config.headers['Content-Type'] = 'application/json;charset=utf-8';
    }
  }
  // 设置响应类型为 blob 以处理二进制数据（如图片）
  if (config.url.includes('png')) {
    config.responseType = 'blob';
    config.headers['Accept'] = 'image/*';
  }

  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 检查响应数据的类型和处理错误代码


  if(response.headers['content-type']=='text/javascript'||
  response.headers['content-type']=='text/html'){
    return response

  }
  if (response.headers['content-type'] && response.headers['content-type'].includes('application/json')) {
    const data = JSONBIG.parse(response.data);

    if (data.code === 401) {
      ElNotification({
        title: '提示1',
        message: h('i', { style: 'color: red' }, data.msg),
      });
      const store = useCounterStore();
      // 移除 token
      removeToken();
      store.incrementUser("");
      router.push({
        name: 'login',
      });
    } else if (data.code && data.code !== 200) {
      ElNotification({
        title: '提示',
        message: h('i', { style: 'color: red' }, data.msg),
      });
    }
    return data;
  } else if (response.config.responseType === 'blob') {
    // 处理二进制数据
    const blob = response.data;
    const imgUrl = URL.createObjectURL(blob);
    return imgUrl;
  } else {
    // 直接返回非 JSON 数据
    return response.data;
  }
}, function (error) {
  // 对响应错误做点什么
  return Promise.reject(error);
});

// 导出我们建立的 axios 实例模块，ES6 export 用法
export default request;
